class Solution {
    public int minCost(int[][] costs) {
        int m = costs.length; // 一共有几个房子
        // 确定状态表示 到第 i 个房子涂成红，蓝，绿3种不同的颜色需要的最少的钱
        int[] r = new int[m];
        int[] b = new int[m];
        int[] g = new int[m];
        int[][] dp = new int[m + 1][3];
        // 确定状态转移方程
        for(int i = 1; i <= m; i++){
            dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];
            dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];
            dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2];
        }
        return Math.min(dp[m][0], Math.min(dp[m][1], dp[m][2]));
    }
}